package com.zjmzxfzhl.modules.app.platform;

import com.sun.mail.util.MailSSLSocketFactory;
import com.zjmzxfzhl.modules.app.form.Chunk;
import com.zjmzxfzhl.modules.app.form.MailContent;
import com.zjmzxfzhl.modules.app.form.MailFile;
import com.zjmzxfzhl.modules.app.form.MailInfo;
import com.zjmzxfzhl.modules.app.util.SslUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.mail.*;
import javax.mail.internet.MimeUtility;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import javax.servlet.http.HttpServletResponse;
import java.io.DataInputStream;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * 电子邮件业务实现
 *
 * @author a2417
 * @version 1.0
 * @date 2020/6/29 10:32
 */
@Component
@Slf4j
public class MailinaboxMailUtils {

    @Value("${mailinabox.serverHost}")
    private String serverHost;
    @Value("${listener.url}")
    private String url;

    /**
     * 获取邮件
     *
     * @param email    邮箱地址
     * @param password 邮箱密码
     * @return
     */
    public List<MailInfo> getMail(String email, String password,Integer orders,String projId) throws Exception {

//        SslUtils.ignoreSsl();

        // 简化证书认证
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);

        Properties prop = new Properties();
        prop.setProperty("mail.debug", "true");
        prop.setProperty("mail.store.protocol", "imap");
        prop.setProperty("mail.pop3.host", serverHost);
        prop.setProperty("mail.imap.port", "993");
        prop.put("mail.imap.ssl.enable",true);
        prop.put("mail.pop3.ssl.enable",true);
        prop.put("mail.pop3.ssl.socketFactory",sf);
        prop.put("mail.imap.ssl.socketFactory",sf);

        // 1、创建session
        Session session = Session.getInstance(prop);
        // 2、通过session得到Store对象
        Store store = session.getStore();
        // 3、连上邮件服务器
        store.connect(serverHost, email, password);
        // 4、获得邮箱内的邮件夹
        Folder folder = store.getFolder("inbox");
        folder.open(Folder.READ_ONLY);
        // 获得邮件夹Folder内的所有邮件Message对象
        Message[] messages = folder.getMessages();

        List<MailInfo> mailInfos=new ArrayList<>();
        if(orders==null){
            for (int i = 0; i < messages.length; i++) {
                MailInfo mailInfo = new MailInfo();
                mailInfo.setName(messages[i].getSubject());
                String sender = (messages[i].getFrom()[0]).toString();
                sender = MimeUtility.decodeText(sender);
                mailInfo.setSender(sender);
                mailInfo.setSentDate(messages[i].getSentDate());
                mailInfo.setOrders(i);
                mailInfos.add(mailInfo);
            }
        } else {
            MailInfo mailInfo = new MailInfo();
            mailInfo.setName(messages[orders].getSubject());
            String sender = (messages[orders].getFrom()[0]).toString();
            sender = MimeUtility.decodeText(sender);
            mailInfo.setSender(sender);
            mailInfo.setSentDate(messages[orders].getSentDate());

            MailContent mailContent = new MailContent();
            if (messages[orders].getContent() instanceof String) {
                mailContent.setPlain(messages[orders].getContent().toString());
                mailInfo.setMailContent(mailContent);
                mailInfos.add(mailInfo);
            } else {
                Multipart multipart = (Multipart) messages[orders].getContent();
//                int count = multipart.getCount();
//
//                List<MailFile> appFileList=new ArrayList<>();
//                List<MailFile> imgFileList=new ArrayList<>();
//                for (int y = 0; y < count; y++) {
//                    // 单个部件     注意：单个部件有可能又为一个Multipart，层层嵌套
//                    BodyPart part = multipart.getBodyPart(y);
//                    // 单个部件类型
//                    String type = part.getContentType().split(";")[0];
//                    /**
//                     * 类型众多，逐一判断，其中TEXT、HTML类型可以直接用字符串接收，其余接收为内存地址
//                     * 可能不全，如有没判断住的，请自己打印查看类型，在新增判断
//                     */
//                    if (type.equals("multipart/alternative")) {        // HTML （文本和超文本组合）
//                        mailContent.setAlternative(part.getContent().toString());
//                    } else if (type.equals("text/plain")) {    // 纯文本
//                        mailContent.setPlain(part.getContent().toString());
//                    } else if (type.equals("text/html")) {    // HTML标签元素
//                        mailContent.setHtml(part.getContent().toString());
//                    } else if (type.equals("multipart/related")) {    // 内嵌资源 (包涵文本和超文本组合)
//                        mailContent.setRelated(part.getContent().toString());
//                    } else if (type.contains("application/")) {        // 应用附件 （zip、xls、docx等）
//                        MailFile mailFile = new MailFile();
//                        // 获取附件名并解码
//                        String fileName = part.getFileName();
//                        fileName = MimeUtility.decodeText(fileName);
//                        mailFile.setFileName(fileName);
//                        String fileUrl=url+"/app/mail/annex/"+projId+"/"+orders+"/"+y+"/"+fileName;
//                        mailFile.setFileUrl(fileUrl);
//                        appFileList.add(mailFile);
//                        mailContent.setApplication(appFileList);
//                    } else if (type.contains("image/")) {            // 图片附件 （jpg、gpeg、gif等）
//                        MailFile mailFile = new MailFile();
//                        // 获取附件名并解码
//                        String fileName = part.getFileName();
//                        fileName = MimeUtility.decodeText(fileName);
//                        mailFile.setFileName(fileName);
//                        String fileUrl=url+"/app/mail/annex/"+projId+"/"+orders+"/"+y+"/"+fileName;
//                        mailFile.setFileUrl(fileUrl);
//                        imgFileList.add(mailFile);
//                        mailContent.setApplication(imgFileList);
//                    }
//                }
                if (projId!=null) {
                    mailContent = getMailContent(multipart, orders, projId);
                    mailInfo.setMailContent(mailContent);
                    mailInfos.add(mailInfo);
                }
            }
        }

        // 5、关闭
        folder.close(false);
        store.close();
        return mailInfos;

    }

    private MailContent getMailContent(Multipart multipart,Integer orders,String projId){

       MailContent mailContent = new MailContent();
       try {
            int count = multipart.getCount();
            List<MailFile> appFileList=new ArrayList<>();
            List<MailFile> imgFileList=new ArrayList<>();
            for (int y = 0; y < count; y++) {
                // 单个部件     注意：单个部件有可能又为一个Multipart，层层嵌套
                BodyPart part = multipart.getBodyPart(y);
                // 单个部件类型
                String type = part.getContentType().split(";")[0];
                /**
                 * 类型众多，逐一判断，其中TEXT、HTML类型可以直接用字符串接收，其余接收为内存地址
                 * 可能不全，如有没判断住的，请自己打印查看类型，在新增判断
                 */
                if (type.equals("multipart/alternative")) {        // HTML （文本和超文本组合）
                    mailContent.setAlternative(getMailContent((Multipart)part.getContent(),orders,projId));
                } else if (type.equals("text/plain")) {    // 纯文本
                    mailContent.setPlain(part.getContent().toString());
                } else if (type.equals("text/html")) {    // HTML标签元素
                    mailContent.setHtml(part.getContent().toString());
                } else if (type.equals("multipart/related")) {    // 内嵌资源 (包涵文本和超文本组合)
                    mailContent.setRelated(part.getContent().toString());
                } else if (type.contains("application/")) {        // 应用附件 （zip、xls、docx等）
                    MailFile mailFile = new MailFile();
                    // 获取附件名并解码
                    String fileName = part.getFileName();
                    fileName = MimeUtility.decodeText(fileName);
                    mailFile.setFileName(fileName);
                    String fileUrl=url+"/app/mail/annex/"+projId+"/"+orders+"/"+y+"/"+fileName;
                    mailFile.setFileUrl(fileUrl);
                    appFileList.add(mailFile);
                    mailContent.setApplication(appFileList);
                } else if (type.contains("image/")) {            // 图片附件 （jpg、gpeg、gif等）
                    MailFile mailFile = new MailFile();
                    // 获取附件名并解码
                    String fileName = part.getFileName();
                    fileName = MimeUtility.decodeText(fileName);
                    mailFile.setFileName(fileName);
                    String fileUrl=url+"/app/mail/annex/"+projId+"/"+orders+"/"+y+"/"+fileName;
                    mailFile.setFileUrl(fileUrl);
                    imgFileList.add(mailFile);
                    mailContent.setApplication(imgFileList);
                }
            }}
       catch (Exception e){
           e.getMessage();
       }
        return mailContent;
    }
}
